#include "Socket.h"
#include "Mutex.h"
#include "ClientHandler.h"
#include <vector>

#define ERROR_SOCKET 3
#define ERROR_ARG 4

int main(int argc, char *argv[]){
		
	
	Socket * cliente;
	ClientHandler * cH;
	std::vector<ClientHandler*> vectorClientes;
	std::vector<Socket*> vectorSocket;
	int max_clientes=1;
	int puerto=0;
			
	/*Si hay max_clientes*/
	if(argv[2]!=NULL)
		max_clientes=atoi(argv[2]);
		
	if(argv[1]!=NULL){
		puerto=atoi(argv[1]);
	}	
	else
		return ERROR_ARG; /*error de argumentos*/
	
	Socket socket(puerto,max_clientes);
	
	/*Si hay error con el socket*/
	if(!socket) {
		return ERROR_SOCKET;		
	}
	
	/*Si no hay error*/	
	int atendidos=0;
	while(atendidos<max_clientes){
			cliente =socket.accept();
			atendidos++;
			cH = new ClientHandler(cliente);
			vectorClientes.push_back(cH);
			vectorSocket.push_back(cliente);
			cH->run();
			
	}
	
	/*Iteradores*/
	std::vector<ClientHandler*>::iterator it;
	std::vector<Socket*>::iterator itS;
		
	/*Espera a que todos terminen*/
	for(it=vectorClientes.begin();it!=vectorClientes.end();it++)
				 (*it)->join();
	
	/*Delete de elementos*/
	for(it=vectorClientes.begin();it!=vectorClientes.end();it++)
				delete *it;
	/*Delete Socket*/
	for(itS=vectorSocket.begin();itS!=vectorSocket.end();itS++)
				delete *itS;
	
	return 0;
}
